<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>C++ Tutorial: Multi-Threaded Programming II - Thread for Win32 (C)</title>
  <meta
 content="C++ Tutorial: Multi-Threaded Programming II - Thread for Win32 (C)"
 name="description" />
  <meta
 content="C++ Tutorial, Multi-Threaded Programming II - Thread for Win32 (C), MultiThreading Programming, Thread for Win32, Creating Processes, Memory Sharing Between Processes"
 name="keywords" />
  <meta http-equiv="Content-Type"
 content="text/html; charset=ISO-8859-1" />
  <link type="text/css" rel="stylesheet" href="../images/bogostyleWidePre.css" />
</head>
<body>
<div id="page" align="center">
<div id="content" style="width: 800px;">
<div id="logo">
<div class="whitetitle" style="margin-top: 70px;">bogotobogo </div>
</div>
<div id="topheader">
<div class="headerbodytext" align="left"><br />
<strong>Bogotobogo</strong><br />
contact@bogotobogo.com </div>
<div class="smallgraytext" id="toplinks"><a href="../index.html">Home</a>
| <a href="../sitemap.html">Sitemap</a>
| <a href="../blog" target="_blank">Contact Us</a>
</div>
</div>
<div id="menu">
<div class="smallwhitetext" style="padding: 9px;" align="right"><a
 href="../index.html">Home</a>
| <a href="../about_us.html">About Us</a>
| <a href="../products.html">Products</a>
| <a href="../our_services.html">Our Services</a>
| <a href="../blog" target="_blank">Contact Us</a>
</div>
</div>
<div id="submenu">
<div class="smallgraytext" style="padding: 9px;" align="right">
<a href="../gif.html">Gif</a> 
|<a href="../java_applet.html">JavaApplet/Web Start</a>
| <a href="../flash.html">Flash</a>
| <a href="../shockwave.html">ShockWave</a>
| <a href="../svg.html">SVG</a>
| <a href="../iPhone.html">iPhone/iPad</a>
| <a href="../android.html">Android</a>
| <a href="../OnHTML5.html">HTML5</a>
| <a href="../Algorithms/algorithms.html">Algorithms</a>
| <a href="../News/NewsMain.html">News</a>
| <a href="../cplusplus/cpptut.html">C++</a>
| <a href="../Java/tutorial/on_java.html">Java</a>
| <a href="../php/phptut.html">PHP</a>
| <a href="../DesignPatterns/introduction.html">Design Patterns</a>
| <a href="../python/pytut.html">Python</a> 
| <a href="../CSharp/.netframework.html">C#</a>
| <a href="../forums.html">Forums</a> 
| <a href="../VisualBasicSQL/introduction.html">Visual Basic</a>
</div>
</div>

<div id="contenttext">

<!-- Use of this code assumes agreement with the Google Custom Search Terms of Service. -->
<!-- The terms of service are available at http://www.google.com/cse/docs/tos.html -->
<form name="cse" id="searchbox_demo" action="http://www.google.com/cse">
  <input type="hidden" name="cref" value="" />
  <input type="hidden" name="ie" value="utf-8" />
  <input type="hidden" name="hl" value="" />
  <input name="q" type="text" size="40" />
  <input type="submit" name="sa" value="Search" />
</form>
<script type="text/javascript" src="http://www.google.com/cse/tools/onthefly?form=searchbox_demo&lang="></script>

<div id="bookmarkshare">
<script type="text/javascript">var addthis_config = {"data_track_clickback":true};</script>
<a class="addthis_button" href="http://www.addthis.com/bookmark.php?v=250&amp;username=khhong7"><img src="http://s7.addthis.com/static/btn/v2/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/></a><script type="text/javascript" src="http://s7.addthis.com/js/250/addthis_widget.js#username=khhong7"></script>
</div>
<br />
<br />
<br />
<br />
<div style="padding: 10px;"><span class="titletext">C++ Tutorial<br />
Multi-Threaded Programming II<br />
Native Thread for Win32 (C)<br />
(Creating Processes)</span></div>
<img src="../images/cplusplus/cpp_logo.jpg" alt="cplusplus logo"/>

<div class="bodytext" style="padding: 12px;" align="justify"> 
<div class="subtitle_2nd" id="FullList">List of C++ Tutorials</div>
<ul>
   <li><a href="cpptut.html">C++ Home</a> </li>
   <li><a href="string.html">String</a> </li>
   <li><a href="constructor.html">Constructor</a> </li>
   <li><a href="operatoroverloading.html">Operator Overloading</a> </li>
   <li><a href="virtualfunctions.html">Virtual Functions</a></li>
   <li><a href="dynamic_cast.html">Dynamic Cast Operator</a></li>
   <li><a href="typecast.html">Type Cast Operators</a></li>
   <li><a href="autoptr.html">Class auto_ptr</a></li>   
   <li><a href="templates.html">Templates</a></li>
   <li><a href="references.html">References for Built-in Types</a></li>
   <li><a href="valuevsreference.html">Pass by Value vs. Pass by Reference</a></li>
   <li><a href="memoryallocation.html">Memory Allocation</a></li>
   <li><a href="friendclass.html">Friend Functions and Friend Classes</a></li>
   <li><a href="functors.html">Functors (Function Objects)</a></li>
   <li><a href="statics.html">Static Variables and Static Class Members</a></li>
   <li><a href="exceptions.html">Exceptions</a></li>
   <li><a href="stackunwinding.html">Stack Unwinding</a></li>
   <li><a href="pointers.html">Pointers</a></li>
   <li><a href="pointers2.html">Pointers II</a></li>
   <li><a href="pointers3.html">Pointers III</a></li>
   <li><a href="assembly.html">Taste of Assembly</a></li>
   <li><a href="smallprograms.html">Small Programs</a></li>
   <li><a href="linkedlist.html">Linked List Examples</a></li>
   <li><a href="binarytree.html">Binary Tree Example Code</a></li>
   <li><a href="stl.html">Standard Template Library (STL) I</a></li>
   <li><a href="stl2.html">Standard Template Library (STL) II - Maps</a></li>
   <li><a href="stl3_iterators.html">Standard Template Library (STL) III - Iterators</a></li>
   <li><a href="slicing.html">Object Slicing and Virtual Table</a></li>
   <li><a href="this_pointer.html">The this Pointer</a></li>
   <li><a href="stackunwinding.html">Stack Unwinding</a></li>
   <li><a href="upcasting_downcasting.html">Upcasting and Downcasting</a></li>
   <li><a href="object_returning.html">Object Returning</a></li>
   <li><a href="private_inheritance.html">Private Inheritance</a></li>
   <li><a href="cplusplus_keywords.html">C++_Keywords</a></li>
   <li><a href="multithreaded.html">Multi-Threaded Programming - Terminology</a></li>
   <li><a href="multithreaded2A.html">Multi-Threaded Programming II - Native Thread for Win32 (A) </a></li>
   <li><a href="multithreaded2B.html">Multi-Threaded Programming II -  Native Thread for Win32 (B) </a></li>
   <li><a href="multithreaded2C.html">Multi-Threaded Programming II -  Native Thread for Win32 (C) </a></li>
   <li><a href="multithreaded2.html">Multi-Threaded Programming II - C++ Thread for Win32</a></li>
   <li><a href="multithreaded3.html">Multi-Threaded Programming III - C++ Class Thread for Pthreads</a></li>
   <li><a href="multithreadedDebugging.html">Multithread Debugging</a></li>
   <li><a href="embeddedSystemsProgramming.html">Embedded Systems Programming</a></li>
   <li><a href="boost.html">Boost</a></li>
   <li>Programming Questions and Solutions
    <ul>
       <li><a href="quiz_strings_arrays.html">Strings and Arrays</a></li>
       <li><a href="quiz_linkedlist.html">Linked List</a></li>
       <li><a href="quiz_recursion.html">Recursion</a></li>
       <li><a href="quiz_bit_manipulation.html">Bit Manipulation</a> </li>
       <li><a href="google_interview_questions.html">140 Google Interview Questions</a> </li>
    </ul>
   </li>
</ul>
</div>
<br />
<img src="images/multithread2C/SokReeSan1.png" alt="SokReeSan1"/>
<br />
<br />
<br />
<br />

<div class="bodytext" style="padding: 12px;" align="justify">
<div class="subtitle" id="mth2pc">Multi-Threaded (Multicore)  Programming II<br />
Native Thread for Win32 (C) - Creating Processes</div>
<br />

<p>To create a new process, we need to call <strong>CreateProcess()</strong>.</p>
<p><strong>Syntax:</strong></p>
<pre>
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);
</pre>
<p><strong>Parameters:</strong><p>
<ul>
<li><strong>lpApplicationName </strong>  [in, optional]  <br />
The name of the module to be executed. <br />
This module can be a Windows-based application. <br />
It can be some other type of module (for example, MS-DOS or OS/2) if the appropriate subsystem is available on the local computer. <br />

The string can specify the full path and file name of the module to execute or it can specify a partial name. In the case of a partial name, the function uses the current drive and current directory to complete the specification. The function will not use the search path. This parameter must include the file name extension; no default extension is assumed.<br />

The <strong>lpApplicationName</strong> parameter can be NULL.<br />
 In that case, the module name must be the first white space�delimited token in the <strong>lpCommandLine</strong> string. <br />

<li><strong>lpCommandLine</strong>   [in, out, optional] <br />
The command line to be executed. The maximum length of this string is 32,768 characters, including the Unicode terminating null character. If <strong>lpApplicationName</strong> is NULL, the module name portion of <strong>lpCommandLine</strong> is limited to MAX_PATH characters.<br />

The <strong>lpCommandLine</strong> parameter can be NULL. In that case, the function uses the string pointed to by <strong>lpApplicationName</strong>  as the command line.<br />

If both <strong>lpApplicationName</strong> and <strong>lpCommandLine</strong> are non-NULL, the null-terminated string pointed to by <strong>lpApplicationName</strong> specifies the module to execute, and the null-terminated string pointed to by <strong>lpCommandLine</strong> specifies the command line. The new process can use <strong>GetCommandLine</strong> to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because <strong>argv[0]</strong> is the module name, C programmers generally repeat the module name as the first token in the command line.</li>
<br />

<li><strong>lpProcessAttributes</strong>  [in, optional] <br />
A pointer to a <strong>SECURITY_ATTRIBUTES</strong> structure that determines whether the returned handle to the new process object can be inherited by child processes. If <strong>lpProcessAttributes</strong> is NULL, the handle cannot be inherited. <br />
</li>
<br />
<li><strong>lpThreadAttributes</strong>  [in, optional] <br />
A pointer to a <strong>SECURITY_ATTRIBUTES</strong> structure that determines whether the returned handle to the new thread object can be inherited by child processes. If <strong>lpThreadAttributes</strong> is NULL, the handle cannot be inherited. <br />

The <strong>lpSecurityDescriptor</strong> member of the structure specifies a security descriptor for the main thread. If <strong>lpThreadAttributes</strong> is NULL o r<strong>lpSecurityDescriptor</strong> is NULL, the thread gets a default security descriptor. The ACLs in the default security descriptor for a thread come from the process token.</li>
<br />
<li><strong>bInheritHandles</strong> [in] <br />
If this parameter TRUE, each inheritable handle in the calling process is inherited by the new process. If the parameter is FALSE, the handles are not inherited. Note that inherited handles have the same value and access rights as the original handles.</li>
<br />
<li><strong>dwCreationFlags</strong> [in] <br />
The flags that control the priority class and the creation of the process. <br />

This parameter also controls the new process's priority class, which is used to determine the scheduling priorities of the process's threads. <br />
If none of the priority class flags is specified, the priority class defaults to <strong>NORMAL_PRIORITY_CLASS</strong> unless the priority class of the creating process is <strong>IDLE_PRIORITY_CLASS</strong. or <strong>BELOW_NORMAL_PRIORITY_CLASS</strong>. In this case, the child process receives the default priority class of the calling process.</li>
<br />
<li><strong>lpEnvironment</strong> [in, optional] <br />

A pointer to the environment block for the new process. If this parameter is NULL, the new process uses the environment of the calling process.<br />

An environment block consists of a null-terminated block of null-terminated strings. Each string is in the following form:
<pre>
name=value\0
</pre>
Because the equal sign is used as a separator, it must not be used in the name of an environment variable.<br />

An environment block can contain either Unicode or ANSI characters. <br />
If the environment block pointed to by <strong>lpEnvironment</strong> contains Unicode characters, be sure that <strong>dwCreationFlags</strong> includes <strong>CREATE_UNICODE_ENVIRONMENT</strong>. <br />
If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that <strong>dwCreationFlags</strong> includes <strong>CREATE_UNICODE_ENVIRONMENT</strong>.</li>
<br />
<li><strong>lpCurrentDirectory</strong> [in, optional] <br />
The full path to the current directory for the process. The string can also specify a UNC path.<br />

If this parameter is NULL, the new process will have the same current drive and directory as the calling process. (This feature is provided primarily for shells that need to start an application and specify its initial drive and working directory.)</li>
<br />
<li><strong>lpStartupInfo</strong> [in] <br />
A pointer to a <strong>STARTUPINFO</strong> or <strong>STARTUPINFOEX</strong> structure.<br />

To set extended attributes, use a <strong>STARTUPINFOEX</strong> structure and specify <strong>EXTENDED_STARTUPINFO_PRESENT</strong> in the <strong>dwCreationFlags</strong> parameter.
Handles in <strong>STARTUPINFO</strong> must be closed with <strong>CloseHandle</strong> when they are no longer needed.</li>
<br />
<li><strong>lpProcessInformation</strong> [out] <br />
A pointer to a <strong>PROCESS_INFORMATION</strong> structure that receives identification information about the new process. <br />

Handles in <strong>PROCESS_INFORMATION</strong> must be closed with <strong>CloseHandle</strong> when they are no longer needed. </li>
</ul>
</pre>
<p>The following example shows the steps necessary to create a new process. If the application is started with a command-line parameter, the process will print this out and then create a child process without any parameters. If the process is started without any parameters, it prints out a message indicating this and exits.</p>
<pre>
#include &lt;Windows.h&gt;
#include &lt;stdio.h&gt;

int main(int argc, char* argv[])
{
	STARTUPINFO startupInfo;
	PROCESS_INFORMATION processInfo;

	if(argc > 1) {
		printf("Argument %s\n", argv[1]);
		printf("Starting child process\n");

		memset(&startupInfo, 0, sizeof(startupInfo));
		memset(&processInfo, 0, sizeof(processInfo));

		startupInfo.cb = sizeof(startupInfo);

		if(<font color="blue">CreateProcess(argv[0], 0, 0, 0, 0, 0, 0, 0, 
				&startupInfo, &processInfo)</font> == 0)
		{
			printf(" Error %d\n", GetLastError());
		}
		WaitForSingleObject(processInfo.<font color="blue">hProcess</font>, INFINITE);
	}
	else {
		printf("No argument\n");
	}

	getchar();

	return 0;
}
</pre>
<p>Output is:</p>
<pre>
Argument myArgument
Starting child process
No argument
</pre>
<p>The handle of the created process is returned in <strong>processInfo.hProcess</strong>. This handle is used to call <strong>WaitForSingleObject()</strong>. This call returns when the child process exits. The child process did not have any argument in the example, so the "No argument" was the output from the child process while the "Argument myArgument" was from the main process.</p>
<p>The following example is passing arguments to a child process. We need to repeat the application name as the first command-line parameter. The entire command line gets passed to the child process.</p>
<pre>
#include &lt;Windows.h&gt;
#include &lt;stdio.h&gt;

int main(int argc, char* argv[])
{
	STARTUPINFO startupInfo;
	PROCESS_INFORMATION processInfo;

	if(argc == 1) {
		char Args[256];
		sprintf_s(Args, "dummyArgs %s", argv[0]);
		memset(&startupInfo, 0, sizeof(startupInfo));
		memset(&processInfo, 0, sizeof(processInfo));

		startupInfo.cb = sizeof(startupInfo);

		if(CreateProcess(argv[0], <font color="blue">Args</font>, 
			0, 0, 0, 0, 0, 0, &startupInfo, &processInfo) == 0)
		{
			printf(" Error %d\n", GetLastError());
		}
		WaitForSingleObject(processInfo.hProcess, INFINITE);
	}
	else {
		printf("argument %s\n", argv[1]);
	}

	getchar();

	return 0;
}
</pre>
<p>Output is:</p>
<pre>
argument c:\users\master\documents\threading\debug\childProc.exe
</pre>
<br />
<br />


<div class="subtitle_2nd" id="sharingmemory">Memory Sharing Between Processes</div>
<p>Processes can share memory between them. Once one process has set up a region of memory with sharing attributes, another can open that region of memory and map it into its address space.</p>
<p>The file mapping function <strong>CreateFileMapping()</strong> is used by the shared memory. The parameter <strong>INVALID_HANDLE_VALUE</strong> is for creating a handle to a region of shared memory. This can then be mapped into the process by calling <strong>MapViewOfFile()</strong>. Except the fact that the function <strong>OpenFileMapping()</strong> is used to obtain the handle, the steps of attaching to an existing region of shared memory are similar. </p>
<p>An object can be shared between processes either by sharing the object's handle or by using a common name. The name can contain any character except a backslash and must start with either the local namespace identifier <strong>Local\</strong> or the global namespace identifier <strong>Global\</strong>. The local namespace is private to each user while the global namespace is shared by all users.</p>
<p>The <strong>OpenFileMapping()</strong> call which opens an existing file mapping object takes three parameters:</p>
<pre>
HANDLE WINAPI OpenFileMapping(
 __in DWORD dwDesiredAccess, 
__in BOOL bInheritHandle, 
__in LPCTSTR lpName ); 
</pre>
<ol>
	<li>The first parameter gives the security attributes for the mapping object, which usually will be <strong>FILE_MAP_ALL_ACCESS</strong> to allow both reading and writing to the share memory.</li>
	<li>The second parameter is a boolean that determines whether the handle can be inherited by child processes.</li>
	<li>The third parameter is the name of the mapping object.</li>
</ol>
<p>The <strong>CreateFileMapping()</strong> call creates the mapping object in the kernel, however, it does not actually map the object into user space. The call to <strong>MapViewOfFile()</strong> causes the shared object to be mapped into memory. The return value of this call is a pointer to the base address of the memory. This call takes file parameters:</p>
<pre>
LPVOID WINAPI MapViewOfFile(
 __in HANDLE hFileMappingObject, 
__in DWORD dwDesiredAccess, 
__in DWORD dwFileOffsetHigh,
 __in DWORD dwFileOffsetLow,
 __in SIZE_T dwNumberOfBytesToMap ); 
</pre>
<p><strong>Parameters:</strong></p>
<ul>
<li><strong>hFileMappingObject</strong> [in] <br />
A handle to a file mapping object. The <strong>CreateFileMapping</strong> and <strong>OpenFileMapping</strong> functions return this handle.</li>
<br />
<li><strong>dwDesiredAccess</strong> [in] <br />
The type of access to a file mapping object, which determines the protection of the pages. This parameter can be one of the following values.</li>
<br />
<li><strong>dwFileOffsetHigh</strong>  [in] <br />
A high-order DWORD of the file offset where the view begins.</li>
<br />
<li><strong>dwFileOffsetLow</strong>  [in] <br />
A low-order DWORD of the file offset where the view is to begin. The combination of the high and low offsets must specify an offset within the file mapping. They must also match the memory allocation granularity of the system. That is, the offset must be a multiple of the allocation granularity. To obtain the memory allocation granularity of the system, use the <strong> GetSystemInfo</strong>  function, which fills in the members of a <strong> SYSTEM_INFO</strong>  structure.</li>
<br />
<li><strong>dwNumberOfBytesToMap</strong>  [in] <br />
The number of bytes of a file mapping to map to the view. All bytes must be within the maximum size specified by <strong> CreateFileMapping</strong> . If this parameter is 0 (zero), the mapping extends from the specified offset to the end of the file mapping.</li>
</ul>
<p>Once the process has finished with the shared memory, it needs to be unmapped by calling <strong>UnMapViewOfFile()</strong>, which takes the base address of the shared memory as a parameter:</p>
<pre>
BOOL WINAPI UnmapViewOfFile(
 __in LPCVOID lpBaseAddress
 ); 
</pre>
<p>Then, the handle can be closed by calling <strong>CloseHandle()</strong>.</p>
<p>The following example demonstrates how a region of memory can be created and then shared between two processes. If the application is started without any parameters, it will create a child process. The parent process will also create a region of shared memory and store a string into the shared memory. The shared memory is given the name <strong>sharedmemory</strong>:</p>
<pre>
char ID[] = TEXT("Local\\sharedmemory");
</pre>
<p>It is created in the <strong>Local\</strong> namespace. So, it is visible to all the processes owned by the user.</p>
<p>The child process attaches to the shared memory and can print out the value of the string stored there by the parent process. Once the child process has printed the string, it unmaps the memory and closes the file handle before exiting. Once the child process has exited, the parent process is free to unmap the memory, close the file handle, and then exit.</p>
<br />
<pre>
#include &lt;Windows.h&gt;
#include &lt;stdio.h&gt;

int main(int argc, char* argv[])
{
	STARTUPINFO startupInfo;
	PROCESS_INFORMATION processInfo;
	HANDLE fileHandle;
	char ID[] = TEXT("Local\\sharedmemory");
	char *memory;

	if(argc == 1) {
		<font color="blue">fileHandle = CreateFileMapping(INVALID_HANDLE_VALUE,
					NULL, PAGE_READWRITE, 0, 1024, ID);
		<font color="blue">memory</font> = (char*)MapViewOfFile(fileHandle, 
					FILE_MAP_ALL_ACCESS, 0, 0, 0);</font>
		sprintf_s(<font color="blue">memory</font>, 1024, "%s", "Data from first process");
		printf("First process: %s\n", <font color="blue">memory</font>);

		memset(&startupInfo, 0, sizeof(startupInfo));
		memset(&processInfo, 0, sizeof(processInfo));
		startupInfo.cb = sizeof(startupInfo);

		char Args[256];
		sprintf_s(Args, "dummyArgs %s", argv[0]);

		CreateProcess(argv[0], Args, 
			0, 0, 0, 0, 0, 0, &startupInfo, &processInfo);
		WaitForSingleObject(processInfo.hProcess, INFINITE);

		<font color="blue">UnmapViewOfFile(memory);
		CloseHandle(fileHandle);</font>
	}
	else {
		<font color="blue">fileHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, ID);
		memory = (char*)MapViewOfFile(fileHandle, 
					FILE_MAP_ALL_ACCESS, 0, 0, 0);</font>

		printf("Second process %s\n", <font color="blue">memory</font>);

		<font color="blue">UnmapViewOfFile(memory);
		CloseHandle(fileHandle);</font>
	}

	getchar();

	return 0;
}
</pre>
<p>The output we get:</p>
<pre>
First process: Data from first process
Second process Data from first process
</pre>
<br />
<img src="images/multithread2C/SokReeSan2.png" alt="SokReeSan2"/>
<br />
<br />

<br /><br />
<div class="subtitle_2nd" id="FullList">List of C++ Tutorials</div>
<ul>
   <li><a href="cpptut.html">C++ Home</a> </li>
   <li><a href="string.html">String</a> </li>
   <li><a href="constructor.html">Constructor</a> </li>
   <li><a href="operatoroverloading.html">Operator Overloading</a> </li>
   <li><a href="virtualfunctions.html">Virtual Functions</a></li>
   <li><a href="dynamic_cast.html">Dynamic Cast Operator</a></li>
   <li><a href="typecast.html">Type Cast Operators</a></li>
   <li><a href="autoptr.html">Class auto_ptr</a></li>
   <li><a href="templates.html">Templates</a></li>
   <li><a href="references.html">References for Built-in Types</a></li>
   <li><a href="valuevsreference.html">Pass by Value vs. Pass by Reference</a></li>
   <li><a href="memoryallocation.html">Memory Allocation</a></li>
   <li><a href="friendclass.html">Friend Functions and Friend Classes</a></li>
   <li><a href="functors.html">Functors</a></li>
   <li><a href="statics.html">Static Variables and Static Class Members</a></li>
   <li><a href="exceptions.html">Exceptions</a></li>
   <li><a href="pointers.html">Pointers</a></li>
   <li><a href="pointers2.html">Pointers II</a></li>
   <li><a href="pointers3.html">Pointers III</a></li>
   <li><a href="assembly.html">Taste of Assembly</a></li>
   <li><a href="smallprograms.html">Small Programs</a></li>
   <li><a href="linkedlist.html">Linked List Examples</a></li>
   <li><a href="binarytree.html">Binary Tree Example Code</a></li>
   <li><a href="stl.html">Standard Template Library (STL) I</a></li>
   <li><a href="stl2.html">Standard Template Library (STL) II - Maps</a></li>
   <li><a href="slicing.html">Object Slicing and Virtual Table</a></li>
   <li><a href="this_pointer.html">The this Pointer</a></li>
   <li><a href="stackunwinding.html">Stack Unwinding</a></li>
   <li><a href="upcasting_downcasting.html">Upcasting and Downcasting</a></li>
   <li><a href="object_returning.html">Object Returning</a></li>
   <li><a href="private_inheritance.html">Private Inheritance</a></li>
   <li><a href="cplusplus_keywords.html">C++_Keywords</a></li>
   <li><a href="multithreaded.html">Multi-Threaded Programming - Terminology</a></li>
   <li><a href="multithreaded2A.html">Multi-Threaded Programming II - Native Thread for Win32 (A) </a></li>
   <li><a href="multithreaded2B.html">Multi-Threaded Programming II -  Native Thread for Win32 (B) </a></li>
   <li><a href="multithreaded2C.html">Multi-Threaded Programming II -  Native Thread for Win32 (C) </a></li>
   <li><a href="multithreaded2.html">Multi-Threaded Programming II - C++ Thread for Win32</a></li>
   <li><a href="multithreaded3.html">Multi-Threaded Programming III - C++ Class Thread for Pthreads</a></li>
   <li><a href="multithreadedDebugging.html">Multithread Debugging</a></li>
   <li><a href="embeddedSystemsProgramming.html">Embedded Systems Programming</a></li>
   <li><a href="boost.html">Boost</a></li>
   <li>Programming Questions and Solutions
    <ul>
       <li><a href="quiz_strings_arrays.html">Strings and Arrays</a></li>
       <li><a href="quiz_linkedlist.html">Linked List</a></li>
       <li><a href="quiz_recursion.html">Recursion</a></li>
       <li><a href="quiz_bit_manipulation.html">Bit Manipulation</a> </li>
       <li><a href="google_interview_questions.html">140 Google Interview Questions</a> </li>
    </ul>
   </li>
</ul>

<br /><br />


<br />


<br />
<br />
<br />


</div>
</div>
<div class="smallgraytext" id="footer"><a href="../index.html">Home</a>
| <a href="../about_us.html">About Us</a>
| <a href="../products.html">products</a>
| <a href="../our_services.html">Our Services</a>
| <a href="#">Contact Us</a>
| Bogotobogo &copy; 2011 | <a target="_blank" href="http://www.bogotobogo.com">Bogotobogo </a>
</div>
</div>
</div>
</body>
</html>
